﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Web.PuntoDeVenta.Code.FrontEnd;
using Web.Framework.Controls;
using CrmContacto.Contracts.Contracts;
using CrmContacto.Contracts;
using Web.Framework;
using Web.PuntoDeVenta.Code;
using Web.Framework.Svc;
using CrmContacto.Contracts.Contracts.Search;
using Web.Framework.Translate;

namespace Web.PuntoDeVenta.App
{
    public partial class CustomerSales : System.Web.UI.Page, IWebMessage
    {
        private ExceptionManager ExceptionManager = new ExceptionManager();

        protected void Page_Load(object sender, EventArgs e)
        {
            ExceptionManager.WebMessager = this;
            if (!this.IsPostBack)
            {
                try
                {
                    bool tieneVentas = false;
                    if (!String.IsNullOrEmpty(this.Request.QueryString["Id"]))
                    {
                        int customerId = Convert.ToInt32(this.Request.QueryString["Id"]);
                        tieneVentas = customerId != 0;
                        if (tieneVentas)
                        {
                            ServiceOptions options = new ServiceOptions();
                            ClienteByIdOptions clientOptions = new ClienteByIdOptions();
                            clientOptions.LoadSales = true;
                            Cliente cliente = WebServiceHelper.GetCustomerById(options, customerId, clientOptions);
                            if (cliente.Ventas.Count > 0)
                            {
                                LoadVentasFromContacto(this.GridCtrlVentas, cliente);
                            }
                            else
                            {
                                tieneVentas = false;
                            }
                        }
                    }
                    
                    if(!tieneVentas)
                    {
                        this.GridCtrlVentas.Visible = false;
                        ShowMessage(LocalizationProvider.Instance["Pdv.CustomerViewSales.MensajeSinVentas"], WebMessageType.Notification);
                    }
                }
                catch (Exception ex)
                {
                    ExceptionManager.HandleException(ex);
                }
            }
        }

        private void LoadVentasFromContacto(GridCtrl gridCtrl, Cliente currentCliente)
        {
            List<VentaCabecera> ventasCabeceraList = new List<VentaCabecera>();
            // Tengo que construir las ventas en VentaCabecera
            //currentCliente.Ventas

            // Agrupo "a mano" por número de factura
            ComparerGrupoFactura comparer = new ComparerGrupoFactura();

            var numerosFacturaList = currentCliente.Ventas.Select(f => new GrupoFactura { Prefijo = f.Prefijo, Talonario = f.Talonario, Factura = f.NumeroFactura, Fecha = f.FechaVenta }).ToList();

            List<GrupoFactura> gruposUnicos = new List<GrupoFactura>();
            foreach (var g in numerosFacturaList)
            {
                if (gruposUnicos.Where(gu => comparer.Equals(gu, g)).Count() == 0)
                {
                    gruposUnicos.Add(g);
                }
            }

            gruposUnicos = gruposUnicos.OrderByDescending(f => f.Fecha).ToList();

            foreach (GrupoFactura grupoFactura in gruposUnicos)
            {
                var facturasList = currentCliente.Ventas.Where(v => v.Prefijo == grupoFactura.Prefijo && v.Talonario == grupoFactura.Talonario && v.NumeroFactura == grupoFactura.Factura).ToList();
                var facturaIndividual = facturasList.First();

                VentaCabecera cabecera = new VentaCabecera();

                cabecera.FechaVenta = facturaIndividual.FechaVenta;
                cabecera.Prefijo = facturaIndividual.Prefijo;
                cabecera.Talonario = facturaIndividual.Talonario;
                cabecera.NumeroFactura = facturaIndividual.NumeroFactura;
                cabecera.NroTransaccion = facturaIndividual.NroTransaccion;
                cabecera.MontoTotal = facturasList.Sum(f => f.Monto);
                cabecera.PuntoVenta = facturaIndividual.PuntoVentaName;
                cabecera.SalesMan = facturaIndividual.SalesMan;
                cabecera.Cupon = facturaIndividual.Cupon;
                cabecera.detalleVentas = LoadDetalleDeVentas(facturasList);

                ventasCabeceraList.Add(cabecera);
            }

            // Cargo la metadata en la grilla y bindeo
            gridCtrl.ColumnMetadataCollection = VentaCabecera.ColumnMetadata;
            gridCtrl.DataSource = ventasCabeceraList;
        }

        private List<VentaDetalle> LoadDetalleDeVentas(List<ClienteVenta> facturasList)
        {
            List<VentaDetalle> ventas = new List<VentaDetalle>();

            VentaDetalle item;
            foreach (var factura in facturasList)
            {
                // No agrego las ventas que no son ventas
                if (factura.CodigoProducto.Trim().Length >= 8)
                {
                    item = new VentaDetalle();
                    item.CodigoProducto = factura.CodigoProducto;
                    item.Cantidad = factura.Cantidad;
                    item.Descripcion = factura.Descripcion;
                    item.Monto = factura.Monto;
                    ventas.Add(item);
                }
            }

            return ventas;
        }

        public void ShowMessage(string message, WebMessageType type)
        {
            ShowMessage("Mensaje", message, type);
        }

        public void ShowMessage(string title, string message, WebMessageType type)
        {
            this.pnlMessages.CssClass = "pnlMessagesClass displayBlock";
            this.txtErrorTitle.Text = title;
            this.txtMessages.Text = message;
            if (type != WebMessageType.Error)
            {
                pnlError.CssClass = "errorPanelMessage";
            }
            else
            {
                pnlError.CssClass = "errorPanelError";
            }
        }
    }
}